// 这个代码是mt_a.c的汇编版本，运行结果不正确，原因未知，其实https://gcc.godbolt.org/生成的汇编也不正确，不明白为什么
.bss
        .align 4
        .type   a, @object
        .size   a, 4
a:
	.zero 4

.text
.globl main
sum:
	pushq %rbp
	movq %rsp, %rbp
	
	// 循环计数器
	movq $10000000, %rcx
.add_loop:
	lock addl $1, a(%rip)
	loop .add_loop	

	movl $0, %eax
	popq %rbp
	ret
.LC0:
	.string "a = %d\n"

test:
	pushq %rbp
	movq %rsp, %rbp

	// 开辟32位空间，存放t1和t2
	subq $32, %rsp	
	// 给全局变量a赋值0
	movl $0, %eax
	xchgl a(%rip), %eax
	// &t1
	leaq -16(%rbp), %rdi
	// attr,传值NULL
	movl $0, %ecx
	// 参数3，函数地址
	movl $sum, %edx
	movl $0, %esi
	call pthread_create
	cltq
	movq %rax, -16(%rbp)

	leaq -24(%rbp), %rdi
	movl $0, %esi
	movl $sum, %edx
	movl $0, %ecx
	call pthread_create
	cltq
	movq %rax, -24(%rbp)

	// t1，这里t1是基本类型，如果是结构体，就不该这样
	movq -16(%rbp), %rdi
	movl $0, %esi
	call pthread_join

	movq -24(%rbp), %rdi
	movl $0, %esi
	call pthread_join

	movl $.LC0, %edi
	movl a(%rip), %esi
	// 到底要不要这句？
	movl $0, %eax
	call printf
	
	leave
	ret

main:
	pushq %rbp
	movq %rsp, %rbp
	movl $0, %eax
	call test
	movl $0, %eax
	call test
	movl $0, %eax
	call test
	movl $0, %eax
	leave
	ret
